/// 引用 CReference)是 Rust 提供的一种指针语义。引用是基于指针的实现，它与指针的区别是，
/// 指针保存的是其指向内存的地址 ，而引用可以看作某块内存的别名 (Alias)，使用 它需要满足
/// 编译器的各种安全检查规则。引用也分为不可变引用和可变引用 。使用&符号进行不可变引用，
/// 使用&mut 符号进行可变引用。
/// 在所有权系统中 ，引用&x也可称为 x 的借用 (Borrowing)， 通过&操作符来完成所有权租借。
/// 既然是借用所有权，那么引用并不会造成绑定变量所有权的转移。但是借用所有权会
/// 让所有者 (owner)受到如下限制 :
/// · 在不可变借用期间，所有者不能修改资源，并且也不能再进行可变借用。
/// · 在可变借用期间，所有者不能访问资源，并且也不能再出借所有权。 引用在离开作用域之时，就是其归还所有权之时。
/// 使用借用，与直接使用拥有所有权的值一样自然 ，而且还不需要转移所有权。
/// 为了保证内存安全，借用必须遵循以下三个规则 。
/// ·规则一:借用的生命周期不能长于出借方(拥有所有权的对象) 的生命周期。
/// ·规则二:可变借用(引用) 不能有别名(Alias)，因为可变借用具有独占性。
/// ·规则 三 : 不可变借用(引用〉不能再次出借为可变借用 。
pub fn start() {
    let mut a = vec![1, 2, 4, 3, 5];
    bubble_sort(&mut a);
    println!("a排序后\ta = {:?}", a);

    let mut f = vec![2.0, 1.0, 9.0, 3.0, 5.0];
    bubble_sort(&mut f);
    println!("f排序后\tf = {:?}", f);
}

// 冒泡排序
fn bubble_sort<T>(a: &mut [T])
where
    T: PartialOrd,
{
    let mut n = a.len();
    let (mut i, mut max_ptr);
    while n > 0 {
        i = 1;
        max_ptr = 0;
        while i < n {
            if a[i - 1] > a[i] {
                // 交换指定位置的元素
                a.swap(i - 1, i);
                max_ptr = i;
            }
            i += 1;
        }
        n = max_ptr;
    }
}
